/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.halos.common.plugins;

import com.halos.common.classpath.ModificadorClassPath;
import com.halos.interfaz.vista.IPanel;
import com.halos.interfaz.vista.IPlugin;
import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.ServiceLoader;
import java.util.Vector;

 
public class CargadorPlugins {
 
    private static final String EXTENSION_JAR = ".jar";
    private static final String DIRECTORIO_PLUGINS = "plugins/";
    
    /**
     * carga los plugins encontrados al classpath
     * @return true si se cargaron los plugins,
     *         false en caso de existir algun error
     */
    public static boolean cargarPlugins() {
        boolean cargados = true;
        try {
            //obtiene el listado de archivos .jar dentro del directorio
            File[] jars = buscarPlugins();
 
            if (jars.length > 0) {
                ModificadorClassPath cp = new ModificadorClassPath();
               
                //a cada jar lo incluye al classpath
                for (File jar : jars) {
                    try {
                        cp.addArchivo(jar);
                    } catch (MalformedURLException ex) {
                        System.err.println("URL incorrecta: " +
                                ex.getMessage());
                    }

                }
            }
        } catch (Exception ex) {
            cargados = false;
            System.err.println(ex.getMessage());
        }
        return cargados;
    }
 
    /**
     * Busca todos los jars de en el directorio de plugins
     * @return jars del directorio de plugins
     */
    private static File[] buscarPlugins() {
        //crea lista vacia de archivos
        Vector< File > vUrls = new Vector< File >();
 
        //si existe el directorio "plugins" continua
        File directorioPlugins = new File(DIRECTORIO_PLUGINS);
        if (directorioPlugins.exists() && directorioPlugins.isDirectory()) {
 
            //obtiene todos los archivos con la extension .jar
            File[] jars = directorioPlugins.listFiles(new FilenameFilter() {
 
                @Override
                public boolean accept(File dir, String name) {
                    return name.endsWith(EXTENSION_JAR);
                }
            });
 
            //los agrega a la lista de archivos
            for (File jar : jars) {
                vUrls.add(jar);
            }
        }
 
        //retorna todos los archivos encontrados
        return vUrls.toArray(new File[0]);
    }
 
    /**
     * Obtiene todos los plugins IPluginMensaje encontrados en el classpath
     * @return lista de plugins encontrados e instanciados
     */
    public static IPanel[] getPlugins() {
 
        //cargamos todas las implementaciones de IPluginMensaje
        //encontradas en el classpath
        ServiceLoader< IPanel > sl =
                ServiceLoader.load(IPanel.class);
        sl.reload();
 
        //crea una lista vacia de plugins IPluginMensaje
        Vector< IPanel > vAv = new Vector< IPanel >();
 
        //cada plugin encontrado es agregado a la lista
        for (Iterator< IPanel  > it = sl.iterator(); it.hasNext();) {
            try {
                IPanel pl = it.next();
                vAv.add(pl);
            } catch (Exception ex) {
                System.err.println("Excepcion al obtener plugin: " +
                        ex.getMessage());
            }
        }
 
        //retorna los plugins encontrados y cargados
        return vAv.toArray(new IPanel[0]);
    }
    
    /**
     * Obtiene todos los plugins IPluginMensaje encontrados en el classpath
     * @return lista de plugins encontrados e instanciados
     */
    public static Object[] getPlugins(Class <?> clase) throws ClassNotFoundException {
 
        //cargamos todas las implementaciones de IPluginMensaje
        //encontradas en el classpath
        ServiceLoader<?> sl = ServiceLoader.load(Class.forName(clase.getName()));
        sl.reload();
 
        //crea una lista vacia de plugins IPluginMensaje
        Vector< Object > vAv = new Vector<  >();
 
        //cada plugin encontrado es agregado a la lista
        for (Iterator<?> it = sl.iterator(); it.hasNext();) {
            try {
                Object pl = it.next();
                vAv.add(pl);
            } catch (Exception ex) {
                System.err.println("Excepcion al obtener plugin: " +
                        ex.getMessage());
            }
        }
 
        //retorna los plugins encontrados y cargados
        return vAv.toArray(new IPlugin[0]);
    }
    
}
